package com.lhy.mymall.service.impl;

import com.lhy.mymall.common.Constant;
import com.lhy.mymall.exception.ExceptionEnum;
import com.lhy.mymall.exception.MallException;
import com.lhy.mymall.mapper.CartMapper;
import com.lhy.mymall.mapper.ProductMapper;
import com.lhy.mymall.pojo.Cart;
import com.lhy.mymall.pojo.Product;
import com.lhy.mymall.service.CartService;
import com.lhy.mymall.vo.CartVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author: 卢辉宇
 * @date: 2022/12/18 11:46
 * @description: 购物车service实现类
 */
@Service
public class CartServiceImp implements CartService {

    @Resource
    ProductMapper productMapper;

    @Resource
    CartMapper cartMapper;

    /**
     * 购物车列表
     * @param userId
     * @return
     */
    @Override
    public List<CartVO> list(Integer userId){
        //mapper层多表联合查出处total字段CartVO的列表。。。
        List<CartVO> cartVOList = cartMapper.selectList(userId);
        //计算出每一个商品的total
        for (int i = 0; i < cartVOList.size(); i++) {
            CartVO cartVO =  cartVOList.get(i);
            cartVO.setTotalPrice(cartVO.getPrice()*cartVO.getQuantity());
        }
        return cartVOList;
    }

    /**
     * 加入购物车，用为返回的信息过多，所以想要进行信息的封装(CartVo)
     * @param userId 用户id
     * @param productId 商品id
     * @param count 数量
     * @return 带有用户id,产品信息，价格等信息的对象
     */
    @Override
    public List<CartVO> add(Integer userId, Integer productId, Integer count) throws MallException {
        //验证商品的有效性。。。
        validProduct(productId, count);

        //正式添加阶段
        //用户购物车中不存在此商品
        //在mapper层查找数据库。。。
        Cart cart = cartMapper.selectByUserIdAndProductId(userId, productId);

        if(cart==null){
            //之前购物车里没有，新增进购物车
            cart = new Cart();
            //把购物车信息补全
            cart.setUserId(userId);
            cart.setProductId(productId);
            //购物车商品的数量
            cart.setQuantity(count);
            //商品勾选状态，在常量类中描述。。。
            //默认选择选中
            cart.setSelected(Constant.Cart.CHECKED);

            //调用mapper层加入数据库...
            cartMapper.insert(cart);
        }else {
            //商品已存在购物车中，则添加数量
            count = cart.getQuantity() + count;
            Cart cartNew = new Cart();
            //把购物车信息更新
            cartNew.setId(cart.getId());
            cartNew.setUserId(cart.getUserId());
            cartNew.setProductId(cart.getProductId());
            //购物车商品的数量
            cartNew.setQuantity(count);
            //默认选择选中
            cartNew.setSelected(Constant.Cart.CHECKED);

            //调用mapper层更新数据库...
            cartMapper.updateById(cartNew);
        }
        //返回list的购物车列表
        return this.list(userId);
    }

    @Override
    public List<CartVO> update(Integer userId, Integer productId, Integer count) throws MallException {
        //验证商品的有效性。。。
        validProduct(productId, count);

        //正式添加阶段
        //用户购物车中不存在此商品
        //在mapper层查找数据库。。。
        Cart cart = cartMapper.selectByUserIdAndProductId(userId, productId);

        if(cart==null){
            //之前购物车里没有，抛出异常
            throw new MallException(ExceptionEnum.UPDATE_FAILED);
        }else {
            //商品存在购物车中，则修改数量
            Cart cartNew = new Cart();
            //把购物车信息更新
            //购物车商品的数量
            cartNew.setQuantity(count);
            cartNew.setId(cart.getId());
            cartNew.setUserId(cart.getUserId());
            cartNew.setProductId(cart.getProductId());
            //默认选择选中
            cartNew.setSelected(Constant.Cart.CHECKED);

            //调用mapper层更新数据库...
            cartMapper.updateById(cartNew);
        }
        //返回list的购物车列表
        return this.list(userId);
    }

    @Override
    public List<CartVO> delete(Integer userId, Integer productId) throws MallException {
        //在mapper层查找数据库。。。
        Cart cart = cartMapper.selectByUserIdAndProductId(userId, productId);

        if(cart==null){
            //购物车里没有，抛出异常
            throw new MallException(ExceptionEnum.DELETE_FAILED);
        }else {
            //商品存在购物车中，则删除
            //调用mapper层更新数据库...
            cartMapper.deleteById(cart.getId());
        }
        //返回list的购物车列表
        return this.list(userId);
    }


    /**
     * 单选中/不选中购物车商品
     * @param userId
     * @param productId
     * @param selected
     * @return
     * @throws MallException
     */
    @Override
    public List<CartVO> selectOrNot(Integer userId, Integer productId, Integer selected) throws MallException {
        //在mapper层查找数据库。。。
        Cart cart = cartMapper.selectByUserIdAndProductId(userId, productId);

        if(cart==null){
            //购物车里没有，抛出异常
            throw new MallException(ExceptionEnum.UPDATE_FAILED);
        }else {
            //商品存在购物车中，则更新
            //调用mapper层更新数据库...
            cartMapper.selectOrNot(userId,productId,selected);
        }
        return this.list(userId);
    }

    /**
     * 全选中/不选中购物车商品
     * @param userId
     * @param selected
     * @return
     * @throws MallException
     */
    @Override
    public List<CartVO> selectAllOrNot(Integer userId, Integer selected) {
        //改变选中状态
        cartMapper.selectAllOrNot(userId,selected);
        return this.list(userId);
    }

    /**
     * 验证商品的有效性
     * 包括商品是否存在，是否上架，是否有库存
     * @param productId
     * @param count
     */
    private void validProduct(Integer productId, Integer count) throws MallException {
        //在mapper层查询此商品。。。
        Product product = productMapper.selectById(productId);
        //判断商品是否存在，是否上架（product.getStatus().equals(0)）最好在常量类中定义...
        /*if(product==null||product.getStatus().equals(0)){*/
        if(product==null||product.getStatus().equals(Constant.SaleStatus.NOT_SALE)){
            //不存在或者已下架
            throw new MallException(ExceptionEnum.NOT_SALE);
        }

        //判断商品库存
        if (count>product.getStock()){
            //库存不足
            throw new MallException(ExceptionEnum.NOT_ENOUGH);
        }

    }
}
